package muhnes.sizoo.dal;

import java.util.List;
import muhnes.sizoo.HibernateUtilZoologia;
import muhnes.sizoo.modelo.Especie;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 * Clase que implementa los metodos definidos en EspecieDao
 * @author Ricardo Orellana
 */
public class EspecieDaoImpl  extends GenericoDAO< Especie, Integer >  
                             implements EspecieDao{
    
    public EspecieDaoImpl() {
        super( HibernateUtilZoologia.getSessionFactory() );
    }
    
    @Override
    protected Class<?> getClaseEntidad () {
        return Especie.class;
    }

    /**
     * Método que devuelve una lista de especies habilitadas 
     */
    @Override
    public List< Especie > buscarHabilitados () {
        Session sesion = fabricaSesion.getCurrentSession();        
        String hql = "from Especie where habilitado = 'true'";
        Query consulta = sesion.createQuery( hql );
        List< Especie > entidades = consulta.list();
        return entidades;
    }

    /**
     * Método que verifica que las especies no se repitan
     * 
     */
    @Override
    public boolean verificarUnicidad(Especie entidad) {
        Session sesion = fabricaSesion.getCurrentSession();        
        String hql = "from Especie where codigoespecie != :codigo " +
                     "and (upper(nombre) = :nombre " +
                     "and upper(subespecie) = :subespecie " +
                     "and upper(variedad) = :variedad)";
        Query consulta = sesion.createQuery( hql );
        consulta.setParameter("codigo", entidad.getCodigoespecie());
        consulta.setParameter("nombre", entidad.getNombre().toUpperCase());
        consulta.setParameter("subespecie", entidad.getSubespecie().toUpperCase());
        consulta.setParameter("variedad", entidad.getVariedad().toUpperCase());
        return consulta.uniqueResult() != null ? true : false;
    }
    
    /**
     * Método que verifica la independencia de la entidad de las otras entidades.
     * 
     */
    @Override
    public boolean verificarDependencia (Especie entidad) {
        Session sesion = fabricaSesion.getCurrentSession();        
        String hql = "from Animal where especie.codigoespecie = :codigo";
        Query consulta = sesion.createQuery( hql );
        consulta.setParameter("codigo",entidad.getCodigoespecie());
        return !consulta.list().isEmpty();
    }

}
